 /*
 ** KF-Ray, raytracer parallèle
 **  perlin.h repris de la version JAVA sur http://mrl.nyu.edu/~perlin/noise/ :
 **  JAVA REFERENCE IMPLEMENTATION OF IMPROVED NOISE - COPYRIGHT 2002 KEN PERLIN
 **
 ** Karin AIT-SI-AMER & Florian DANG
 ** <aitsiame@polytech.upmc.fr>
 ** <tdang@polytech.upmc.fr>
 **
 */

#ifndef PERLIN_H_
#define PERLIN_H_

/**
 * \file	perlin.h
 * \brief	Bruit de Perlin
 * \author	Karin Ait-Si-Amer et Florian Dang
 * \version	1.0.1
 * \date	Fevrier-Mai 2009
 *
 * Fonctions utiles pour le calcul du bruit de Perlin.
 * Repris depuis la version Java disponible sur le site de l'auteur
 * http://mrl.nyu.edu/~perlin/noise/
 *
 */

static const int permutation[] = { 151,160,137,91,90,15,
131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,
21,10,23,190,6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,
35,11,32,57,177,33,88,237,149,56,87,174,20,125,136,171,168,68,175,
74,165,71,134,139,48,27,166,77,146,158,231,83,111,229,122,60,211,133,
230,220,105,92,41,55,46,245,40,244,102,143,54,65,25,63,161,1,216,
80,73,209,76,132,187,208,89,18,169,200,196,135,130,116,188,159,86,
164,100,109,198,173,186,3,64,52,217,226,250,124,123,5,202,38,147,
118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,223,
183,170,213,119,248,152,2,44,154,163,70,221,153,101,155,167,43,
172,9,129,22,39,253,19,98,108,110,79,113,224,232,178,185,112,104,
218,246,97,228,251,34,242,193,238,210,144,12,191,179,162,241,81,51,
145,235,249,14,239,107,49,192,214,31,181,199,106,157,184,84,204,176,
115,121,50,45,127,4,150,254,138,236,205,93,222,114,67,29,24,72,243,
141,128,195,78,66,215,61,156,180
}; /*!< Matrice de permutation pour générer le bruit de Perlin */


/**
 * \fn 		float	Fade(float t);
 * \brief 	COMPUTE FADE CURVES FOR EACH OF X,Y,Z.
 *		Plus d'infos sur http://mrl.nyu.edu/~perlin/
 *
 * \param	t	Coordonnée t
 *
 * \return	un nombre flottant : coefficient de bruit de Perlin
 */
float	Fade(float t);


/**
 * \fn 		float   Lerp(float t, float a, float b);
 * \brief 	COMPUTE FADE CURVES FOR EACH OF X,Y,Z.
 *		Plus d'infos sur http://mrl.nyu.edu/~perlin/
 *
 * \param	t	Paramètre t
 * \param	a	Paramètre a
 * \param	b	Paramètre b
 *
 * \return	un nombre flottant : coefficient de bruit de Perlin
 */
float   Lerp(float t, float a, float b);


/**
 * \fn 		float   Grad(int hash, float x, float y, float z);
 * \brief 	CONVERT LO 4 BITS OF HASH CODE INTO 12 GRADIENT DIRECTIONS.
 *		Plus d'infos sur http://mrl.nyu.edu/~perlin/
 *
 * \param	hash	Hash
 * \param	x	Coordonnée x
 * \param	y	Coordonnée y
 * \param	z	Coordonnée z
 *
 * \return	un nombre flottant : coefficient de bruit de Perlin
 */
float   Grad(int hash, float x, float y, float z);


/**
 * \fn 		float   Pnoise(float x, float y, float z);
 * \brief 	Fonction de génération du bruit de Perlin
 *		Plus d'infos sur http://mrl.nyu.edu/~perlin/
 *
 * \param	x	Coordonnée x
 * \param	y	Coordonnée y
 * \param	z	Coordonnée z
 *
 * \return	un nombre flottant : coefficient de bruit de Perlin
 */
float   Pnoise(float x, float y, float z);

#endif	/* PERLIN_H_ */

